interface Duck {
  sound: "嘎嘎嘎";
  swin(): void;
}

let person = {
  name: "伪装成鸭子的人",
  age: 11,
  sound: "嘎嘎嘎" as "嘎嘎嘎",
  swin() {
    console.log(this.name + "正在游泳");
  },
};

// 引用类型类型兼容使用鸭子类型（这样的原因：一些第三方库的引用类型我们不需要完全定义类型，只要必要的类型一致就满足）
// 当直接使用对象字面量时，会使用更加严格的类型判断（原因：你使用了字面量类型就表示这个类型你肯定知道有哪些类型，其他未知类型没有意义）
let duck: Duck = person;

interface User {
  name?: string;
  age: number;
}

let obj = {
  nema: "adc",
  age: 12,
};

let u: User = obj;

// 函数类型
interface Condition {
  (n: number, i: number): boolean;
}

function sum(numbers: number[], calllBack: Condition) {
  let s = 0;
  numbers.forEach((item, index) => {
    if (calllBack(item, index)) {
      s += item;
    }
  });

  return s;
}

// console.log(sum([2, 34, 4, 5], (n, i) => n % 2 !== 0));
console.log(sum([2, 34, 4, 5], (n, i) => i % 2 !== 0));

export {};
